]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
dnd: Update actor position after scaling even when animations are off
authorSebastian Keller <skeller@gnome.org>
Wed, 3 Feb 2021 00:59:00 +0000 (01:59 +0100)
committerMarge Bot <marge-bot@gnome.org>
Thu, 4 Feb 2021 16:39:55 +0000 (16:39 +0000)
The code to update the actor position based on the cursor and current
scale was run in a 'new-frame' handler. This is working fine when
animations are enabled, but when they are turned off this does not work.
This is because the 'new-frame' signal is emitted before the changes for
that frame are applied. So with animations off the position was only
ever updated with the starting values. As a result the shrunk actor was
not being dragged by the position where it was clicked, but by where it
was clicked in the original size, which is likely not even on the shrunk
actor.

This change now also updates the position in the onComplete handler
which gets run with the final scale, even if the duration is 0.

Fixes https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/1699

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1627>

js/ui/dnd.js

index f6debef584a279cf81874b55e98d1879bba5369b..6f5524107897e332edeed0a0cc2917f0c135757d 100644 (file)
@@ -455,20 +455,29 @@ var _Draggable = class _Draggable {
                     scale_y: scale * origScale,
                     duration: SCALE_ANIMATION_TIME,
                     mode: Clutter.AnimationMode.EASE_OUT_QUAD,
+                    onComplete: () => {
+                        this._updateActorPosition(origScale,
+                            origDragOffsetX, origDragOffsetY, transX, transY);
+                    },
                 });
 
                 this._dragActor.get_transition('scale-x').connect('new-frame', () => {
-                    let currentScale = this._dragActor.scale_x / origScale;
-                    this._dragOffsetX = currentScale * origDragOffsetX - transX;
-                    this._dragOffsetY = currentScale * origDragOffsetY - transY;
-                    this._dragActor.set_position(
-                        this._dragX + this._dragOffsetX,
-                        this._dragY + this._dragOffsetY);
+                    this._updateActorPosition(origScale,
+                        origDragOffsetX, origDragOffsetY, transX, transY);
                 });
             }
         }
     }
 
+    _updateActorPosition(origScale, origDragOffsetX, origDragOffsetY, transX, transY) {
+        const currentScale = this._dragActor.scale_x / origScale;
+        this._dragOffsetX = currentScale * origDragOffsetX - transX;
+        this._dragOffsetY = currentScale * origDragOffsetY - transY;
+        this._dragActor.set_position(
+            this._dragX + this._dragOffsetX,
+            this._dragY + this._dragOffsetY);
+    }
+
     _maybeStartDrag(event) {
         let [stageX, stageY] = event.get_coords();